#pragma once

#include <iostream>
#include <fstream>
#include <string>

// 工具类

class Util
{
public: // std::vector<char>
	static bool ReadFileContent(const std::string &filename, std::string *out)
	{
		// version1: 默认是以文本方式读取文件的. 图片是二进制的.
		// std::ifstream in(filename);//打开一个文件,来读取文本文件
		// if(!in.is_open())
		// {
		// 	return false;
		// }
		// std::string line;
		// while(std::getline(in, line))
		// {
		// 	*out += line;
		// }
		// in.close();

		// version2修正：以二进制方式进行读取

		int filesize = FileSize(filename);
		if (filesize <= 0)
		{
			return false;
		}

		// 明确使用二进制模式打开文件
		std::ifstream in(filename, std::ios::binary);
		if (!in.is_open())
		{
			return false;
		}

		// 调整字符串大小以容纳整个文件
		out->resize(filesize);

		// 使用string::data()（C++11及以后）获取可写缓冲区
		in.read(out->data(), filesize);

		// 验证是否完整读取
		if (!in)
		{
			return false;
		}

		// 文件流会在析构时自动关闭，无需手动调用close()
		return true;
	}

	//于从字符串 bigstr 中提取以分隔符 sep 为界限的第一行内容，并将其存储到输出字符串 out 中
	//用于解析 HTTP 请求头或其他文本协议中的行数据
	static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep/*\r\n*/)
	{
		auto pos = bigstr.find(sep);
		if(pos == std::string::npos)
			return false;
		
		*out = bigstr.substr(0, pos);
		bigstr.erase(0, pos + sep.size());
		return true;
	}

	static std::streamsize FileSize(const std::string &filename)
	{
		std::ifstream in(filename, std::ios::binary);
		if (!in.is_open()) {
			return -1;
		}
		
		// 保存当前位置（可选）
		auto original_pos = in.tellg();
		
		// 定位到文件末尾
		in.seekg(0, std::ios::end);
		
		// 获取文件大小
		auto filesize = in.tellg();
		
		// 重置文件指针（如果需要继续读取文件）
		if (original_pos != -1) {
			in.seekg(original_pos);
		} else {
			in.seekg(0, std::ios::beg);
		}
		
		// 检查 tellg() 是否失败
		if (filesize == -1) {
			return -1;
		}
		
		return filesize;
	}
};